/**
 * 用户行为埋点数据收集路由
 */
const Router = require('koa-router');
const router = new Router({
  prefix: '/track'
});
const db = require('../../db');

/**
 * 简单测试路由，检查API是否可访问
 * GET /api/weblog/track/test
 */
router.get('/test', async (ctx) => {
  ctx.body = {
    code: 200,
    message: 'weblog track接口可以访问',
    timestamp: new Date().toISOString()
  };
});

/**
 * 接收前端埋点数据
 * POST /api/weblog/track
 */
router.post('/', async (ctx) => {
  try {
    const { events, deviceInfo } = ctx.request.body;
    
    if (!events || !Array.isArray(events) || events.length === 0) {
      ctx.body = {
        code: 400,
        message: '无效的埋点数据'
      };
      return;
    }
    
    console.log('📊 收到埋点数据:', events.length, '条事件');
    
    // 获取设备信息字符串
    const deviceInfoStr = deviceInfo ? JSON.stringify(deviceInfo) : null;
    
    // 处理每个事件
    const insertPromises = events.map(async (event) => {
      const {
        user_id,
        event_type,
        timestamp,
        course_id,
        extra_data
      } = event;
      
      // 确保额外数据是字符串
      const extraDataStr = extra_data ? JSON.stringify(extra_data) : null;
      
      // 尝试两种方式写入数据，支持有无device_info字段的表结构
      try {
        try {
          // 先尝试包含device_info的方式
          await db.executeQuery(
            `INSERT INTO user_behaviors 
             (user_id, event_type, timestamp, course_id, extra_data, device_info) 
             VALUES (?, ?, ?, ?, ?, ?)`,
            [user_id, event_type, timestamp, course_id || null, extraDataStr, deviceInfoStr]
          );
        } catch (error) {
          if (error.code === 'ER_BAD_FIELD_ERROR') {
            // 如果字段不存在，使用不包含device_info的插入方式
            await db.executeQuery(
              `INSERT INTO user_behaviors 
               (user_id, event_type, timestamp, course_id, extra_data) 
               VALUES (?, ?, ?, ?, ?)`,
              [user_id, event_type, timestamp, course_id || null, extraDataStr]
            );
          } else {
            throw error; // 其他错误则继续抛出
          }
        }
        console.log(`✅ 埋点数据写入成功: ${event_type}`);
        return true;
      } catch (err) {
        console.error(`❌ 埋点数据写入失败:`, err.message);
        return false;
      }
    });
    
    // 等待所有写入完成
    const results = await Promise.all(insertPromises);
    const successCount = results.filter(r => r).length;
    
    ctx.body = {
      code: 200,
      message: `成功记录 ${successCount}/${events.length} 条埋点数据`,
      success: successCount,
      total: events.length
    };
  } catch (err) {
    console.error('处理埋点数据失败:', err);
    ctx.body = {
      code: 500,
      message: '服务器内部错误',
      error: err.message
    };
  }
});

/**
 * 获取最近埋点数据（管理端接口，不需要权限验证）
 * GET /api/weblog/track/recent
 */
router.get('/recent', async (ctx) => {
  try {
    // 临时移除权限验证
    const { limit = 100 } = ctx.query;
    
    // 获取最近埋点数据
    const rows = await db.executeQuery(
      `SELECT * FROM user_behaviors 
       ORDER BY timestamp DESC 
       LIMIT ?`,
      [Math.min(parseInt(limit), 500)]
    );
    
    // 解析JSON字符串为对象
    const data = rows.map(row => {
      const result = { ...row };
      
      // 解析extra_data
      if (row.extra_data) {
        try {
          result.extra_data = JSON.parse(row.extra_data);
        } catch (e) {
          result.extra_data = row.extra_data;
        }
      }
      
      // 解析device_info
      if (row.device_info) {
        try {
          result.device_info = JSON.parse(row.device_info);
        } catch (e) {
          result.device_info = row.device_info;
        }
      }
      
      return result;
    });
    
    ctx.body = {
      code: 200,
      message: '获取最近埋点数据成功',
      data
    };
  } catch (err) {
    console.error('获取埋点数据失败:', err);
    ctx.body = {
      code: 500,
      message: '服务器内部错误',
      error: err.message
    };
  }
});

module.exports = router; 